package com.zhdl.network.asciirtu.analysis;

import cn.hutool.core.util.HexUtil;
import com.project.command.faq.analysis.ComAnalysis;
import com.project.command.faq.analysis.ComAnalysisData;
import com.project.command.faq.analysis.ComAnalysisResult;
import com.project.common.util.CRC16;
import com.zhdl.network.asciirtu.dto.AsciiRtuDto;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service(AsciiRtuAnalysis.ASCII_RTU_ANALYSIS)
public class AsciiRtuAnalysis implements ComAnalysis<AsciiRtuDto, ByteBuf> {

    public static final String ASCII_RTU_ANALYSIS = "ascii_rtu";

    ByteBuf buf = Unpooled.buffer();// 无限制长度


    /**
     * com原始返回数据,进行解析
     * 将ByteBuf 数据,转换为list初步解析对象
     * 接收示例数据 01 05 00 00 FF 00 8C 3A
     *
     * @param data 需要解析的数据
     * @return 可能多个数据包
     */
    @Override
    public ComAnalysisResult<AsciiRtuDto> analysisData(ComAnalysisData<ByteBuf> data) {
        List<AsciiRtuDto> fullFrames = new ArrayList<AsciiRtuDto>();
        try {
            // 循环读取数据流中的数据，一个字节一个字节的读取
            // mark当前Index，如果无法处理，则重置index，再有数据时仍然从头开始匹配
            buf = data.getBuf();
            buf.markReaderIndex();
            AsciiRtuDto asciiRtuDto = new AsciiRtuDto();

            int i = buf.readableBytes();
            byte[] bytes = new byte[i];
            buf.readBytes(bytes);

            asciiRtuDto.setUnitBuff(bytes);
            asciiRtuDto.setFullBuff(bytes);
            fullFrames.add(asciiRtuDto);
        } catch (Exception ex) {
            ex.printStackTrace();
            buf.resetReaderIndex();
        }
        log.info("Modbus Analysis" + "return ComAnalysisResult>>>>>>>>>>>>>>>");
        return new ComAnalysisResult<>(fullFrames);
    }


    /**
     * 获取协议头信息
     *
     * @return
     */
    @Override
    public String getHeadAnalysis() {
        return "";
    }

    /**
     * 协议追加校验位信息（尾部数据）
     *
     * @param cmdStr
     * @return
     */
    @Override
    public byte[] getAfterAnalysis(String cmdStr) {
        return HexUtil.decodeHex(cmdStr);
    }
}
